網路上沒找到,記錄在這邊,說不定未來有機會幫上其他人。
#前提:
一個解決方案,裡面有A、B、C三個專案,B專案依賴於A、C專案依賴於B
C為unittest的.exe執行檔,A與B皆編譯為.lib檔。
#狀況:
編譯方法是依序編譯A B C三個專案:
msbuild.exe A.vcxproj /p:configuration=debug /p:platform=x64
msbuild.exe B.vcxproj /p:configuration=debug /p:platform=x64
msbuild.exe C.vcxproj /p:configuration=debug /p:platform=x64
編譯到C專案時發生問題,顯示LNK2001: unresolved external symbol,
所有B專案的function皆被判定為外部符號,無法使用。
屬性→連結器→輸入→其他相依性已增加B專案的lib。
其中若使用Visual Studio編譯方案皆無問題,或是使用
msbuild.exe solution.sln /p:configuration=debug /p:platform=x64
編譯整個解決方案皆可編譯成功
##編譯錯誤時,console的輸出可以看到:
Link:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\HostX86\x64\link.exe ... "D:\project\.\x64\Debug\*Undefined*.lib"...
原本應該出現B.lib的地方變成了Undefined.lib
#原因:
屬性→連結器→輸入→其他相依性中不能使用SolutionName,在單獨編譯時會找不到對應的名稱:
(X)
$(SolutionDir)$(PlatformTarget)\$(Configuration)\$(SolutionName).lib
(O) 請使用直接檔名指定:
$(SolutionDir)$(PlatformTarget)\$(Configuration)\B.lib